<!--
Copyright © 2017, Che-Wei Hsu <cwxhsu@gmail.com>
This file is part of the MintCM.
Some rights reserved. See README.
-->

<html>

<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="../css/mcm_style.css">
</head>

<body class="css_body">

<div class="css_div_box_frame_full">
  <div class="css_div_box_title">chapter 07-03</div>
  <div class="css_div_box_content">
  </div>
</div>
<br>

<div class="css_div_box_frame_full">
  <div class="css_div_box_title">還原預設值 (內部)</div>
  <div class="css_div_box_content">
    <br>

    此章節說明當資料現在值檔案損毀導致資料錯誤時, 如何使用 [還原預設值 (外部)] 模式做處理.
    <br><br><br>

    如果需要將設備重新開機做處理的話, 就需要使用此模式, 系統會執行外部批次檔或程式實行.
    <br><br>

  </div>
</div>
<br>

<div class="css_div_box_frame_full">
  <div class="css_div_box_title">使用方式</div>
  <div class="css_div_box_content">
    <br>

    使用 [還原預設值 (外部)] 模式時系統的處理步驟 :<br>
    <table class="css_table_list1">
      <tr>
        <td class="css_td_list1_l">01.&nbsp;</td>
        <td class="css_td_list1_r">
          載入資料現在值檔案, 檢查資料有無錯誤.
          <table class="css_table_list1">
            <tr>
              <td class="css_td_list1_l">a.&nbsp;</td>
              <td class="css_td_list1_r">
                如果是 <font class="css_font_g1">能夠檢測到並且可以標記的錯誤</font>
                <a href="mcm_0701.html#hook_0701_detect_and_mark_01">[詳細]</a>,
                將該筆資料貼上對應的錯誤狀態.
              </td>
            </tr>
            <tr>
              <td class="css_td_list1_l">b.&nbsp;</td>
              <td class="css_td_list1_r">
                如果是 <font class="css_font_g1">能夠檢測到<font class="css_font_r1">但是無法標記</font>的錯誤</font>
                <a href="mcm_0701.html#hook_0701_detect_not_mark_01">[詳細]</a>,
                只會顯示有錯誤, 不會貼上對應的錯誤狀態.
              </td>
            </tr>
          </table>
        </td>
      </tr>
      <tr>
        <td class="css_td_list1_l">02.&nbsp;</td>
        <td class="css_td_list1_r">
          檢查每筆資料的狀態是否被貼上錯誤, 如果是, 開始還原預設值處理.
          <table class="css_table_list1">
            <tr>
              <td class="css_td_list1_l">a.&nbsp;</td>
              <td class="css_td_list1_r">
                刪除資料現在值檔案
              </td>
            </tr>
            <tr>
              <td class="css_td_list1_l">b.&nbsp;</td>
              <td class="css_td_list1_r">
                執行特定函式處理執行外部批次檔或程式.
              </td>
            </tr>
            <tr>
              <td class="css_td_list1_l">c.&nbsp;</td>
              <td class="css_td_list1_r">
                系統結束執行.
              </td>
            </tr>
            <tr>
              <td class="css_td_list1_l">d.&nbsp;</td>
              <td class="css_td_list1_r">
                設備重新開機後啟動 mcm_daemon, 會載入資料預設值檔案.
              </td>
            </tr>
          </table>
        </td>
      </tr>
    </table>
    <br>

    需要在 [b] 的函式內加入要執行的外部批次檔或程式.
    <br><br>

  </div>
</div>
<br>

<div class="css_div_box_frame_full">
  <div class="css_div_box_title">處理函式</div>
  <div class="css_div_box_content">
    <br>

    處理函式要放在 <font class="css_font_b1">mint_cm/mcm_daemon/mcm_module</font> 內, 新增一個 C 檔案, 內容為 :<br>
    <div class="css_div_block">
      #include "mcm_lib/mcm_lheader/mcm_type.h"<br>
      #include "mcm_lib/mcm_lheader/mcm_return.h"<br>
      #include "mcm_lib/mcm_lheader/mcm_debug.h"<br>
      #include "../mcm_action_handle_define.h"<br><br>
      struct mcm_action_module_t MCM_ACTION_CUSTOM_MODULE_BOOT_PROFILE_LIST_NAME[] =<br>
      {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;{""}<br>
      };<br><br>
      struct mcm_action_module_t MCM_ACTION_CUSTOM_MODULE_BOOT_OTHER_LIST_NAME[] =<br>
      {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;{""}<br>
      };<br><br>
      <font class="css_font_g1">
      int MCM_ACTION_CUSTOM_RESET_DEFAULT_NAME(<br>
      &nbsp;&nbsp;&nbsp;&nbsp;void)<br>
      {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;return MCM_RCODE_PASS;<br>
      }</font>
    </div>
    <br><br>

    此章節只需要用到 <font class="css_font_g1">MCM_ACTION_CUSTOM_RESET_DEFAULT_NAME{}</font>
    <br><br>

    在函式內處理執行外部批次檔或程式的動作.<br>
    範例 :<br>
<pre class="css_pre_code">
#include &lt;errno.h&gt;
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;sys/stat.h&gt;
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_debug.h"
#include "../mcm_action_handle_define.h"

struct mcm_action_module_t MCM_ACTION_CUSTOM_MODULE_BOOT_PROFILE_LIST_NAME[] =
{
    {""}
};

struct mcm_action_module_t MCM_ACTION_CUSTOM_MODULE_BOOT_OTHER_LIST_NAME[] =
{
    {""}
};

int MCM_ACTION_CUSTOM_RESET_DEFAULT_NAME(
    void)
{
    int fret = MCM_RCODE_MODULE_INTERNAL_ERROR;
    char *script_path = "reset_default.sh", cmd_buf[32];
    FILE *file_fp;


    // 建立外部 shell script, 使用外部 shell script 處理.
    if((file_fp = fopen(script_path, "w")) == NULL)
    {
        MCM_EMSG("call fopen(%s) fail [%s]", script_path, strerror(errno));
        goto FREE_01;
    }

    fprintf(file_fp, "#!/bin/sh\n");

    // 等待一段時間, 等目前的程式關閉.
    fprintf(file_fp, "sleep 3\n");

    // 重新執行.
    fprintf(file_fp,
            "./mcm_daemon "
            "-t 0 "
            "-a @mintcm "
            "-l ./mcm_module.lib "
            "-m mcm_model_profile.txt "
            "-d mcm_store_profile_default.txt "
            "-c mcm_store_profile_current.txt "
            "-s 0 "
            "-e 1 "
            "-p /var/run/mcm_daemon.pid &\n");

    fprintf(file_fp, "rm -f $0\n");

    fclose(file_fp);
    chmod(script_path, 0777);

    // 執行 shell script.
    snprintf(cmd_buf, sizeof(cmd_buf), "./%s &", script_path);
    if(system(cmd_buf) == -1)
    {
        MCM_EMSG("call system(%s) fail", cmd_buf);
        goto FREE_01;
    }

    fret =  MCM_RCODE_PASS;
FREE_01:
    return fret;
}
</pre>
<br><br>

    執行完 MCM_ACTION_CUSTOM_RESET_DEFAULT_NAME{} 後, mcm_daemon 會結束執行.
    <br><br>

  </div>
</div>
<br>

<div class="css_div_box_frame_full">
  <div class="css_div_box_title">範例程式的使用</div>
  <div class="css_div_box_content">
    <br>

    <table class="css_table_list1">
      <tr>
        <td class="css_td_list1_l">01.&nbsp;</td>
        <td class="css_td_list1_r">
          範例程式目錄在 <font class="css_font_b1">mint_cm/usage/example/0703</font>.
        </td>
      </tr>
    </table>
    <br><br>

    <table class="css_table_list1">
      <tr>
        <td class="css_td_list1_l">02.&nbsp;</td>
        <td class="css_td_list1_r">
          下面關於 <font class="css_font_p1">make</font> 的操作沒有特別註明的話都是在
          <font class="css_font_b1">mint_cm</font> 目錄.
        </td>
      </tr>
    </table>
    <br><br>

    <table class="css_table_list1">
      <tr>
        <td class="css_td_list1_l">03.&nbsp;</td>
        <td class="css_td_list1_r">
          第一次使用, 使用 <font class="css_font_p1">make example_add KEY=0703</font>
          載入範例並編譯.
        </td>
      </tr>
    </table>
    <br><br>

    <table class="css_table_list1">
      <tr>
        <td class="css_td_list1_l">04.&nbsp;</td>
        <td class="css_td_list1_r">
          執行 mcm_daemon 並加入 <font class="css_font_p1">-e 1</font> 參數就可以看到結果.<br>
          注意當程式檢查到錯誤並執行處理後, mcm_store_profile_current.txt 會重新產生並且內容是正確的的.
        </td>
      </tr>
    </table>
    <br><br>

    <table class="css_table_list1">
      <tr>
        <td class="css_td_list1_l">05.&nbsp;</td>
        <td class="css_td_list1_r">
          測試完畢不使用後, 使用 <font class="css_font_p1">make example_del KEY=0703</font>
          將範例移除.
        </td>
      </tr>
    </table>
    <br><br>

    <table class="css_table_list1">
      <tr>
        <td class="css_td_list1_l">06.&nbsp;</td>
        <td class="css_td_list1_r">
          範例程式目錄下的檔案在做完 <font class="css_font_p1">make example_add</font>
          後會複製到真正使用的位置, 要修改做測試的話要改在複製後的.<br>
          <table class="css_table_list2">
            <tr>
              <td class="css_td_list2_r1">
                來源 <font class="css_font_b1">profile/mcm_data_profile_0703.xml</font><br>
                目地 <font class="css_font_b1">mint_cm/mcm_build/mcm_data_profile.xml</font><br>
                資料模型範例<br>
                有修改要使用 <font class="css_font_p1">make all</font> 重新編譯
              </td>
            </tr>
            <tr>
              <td class="css_td_list2_r1">
                來源 <font class="css_font_b1">profile/mcm_store_profile_default_0703.txt</font><br>
                目地 <font class="css_font_b1">mint_cm/mcm_build/mcm_store_profile_default.txt</font><br>
                資料預設值範例<br>
                使用 <font class="css_font_p1">make all</font> 後會再複製到 <font class="css_font_b1">mint_cm/run</font>
              </td>
            </tr>
            <tr>
              <td class="css_td_list2_r1">
                來源 <font class="css_font_b1">profile/mcm_store_profile_current_0703.txt</font><br>
                目地 <font class="css_font_b1">mint_cm/run/mcm_store_profile_current.txt</font><br>
                資料現在值範例<br>
              </td>
            </tr>
            <tr>
              <td class="css_td_list2_r1">
                來源 <font class="css_font_b1">module/mcm_custom_0703.c</font><br>
                目地 <font class="css_font_b1">mint_cm/mcm_daemon/mcm_module</font><br>
                處理函式範例<br>
                有修改要使用 <font class="css_font_p1">make all</font> 重新編譯
              </td>
            </tr>
          </table>
        </td>
      </tr>
    </table>
    <br>

  </div>
</div>
<br>

</body>

</html>
